﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using SystemCenterSoa.BaseLibrary.Tools.TypeTools;
using SystemCenterSoa.DtoModel.SystemManager;
using SystemCenterSoa.IRepository.SystemManager;
using SystemCenterSoa.PoModel.SystemManager;

namespace SystemCenterSoa.Service.SystemManager
{
    //WebSystemMenuService
    public class WebSystemMenuService
    {
        private IWebSystemMenuRepository _IWebSystemMenuRepository;
        public WebSystemMenuService(IWebSystemMenuRepository IWebSystemMenuRepository)
        {
            _IWebSystemMenuRepository = IWebSystemMenuRepository;
        }

        /// <summary>
        /// 获取所有模块,调用dal层的方法，，获取到所有的模块
        /// </summary>
        /// <returns></returns>
        public List<WebSystemMenuPo> GetWebSystemMenuPoAll()
        {
            return _IWebSystemMenuRepository.GetWebSystemMenuPoAll();
        }
        /// <summary>
        /// 从数据库获取所有的模块, 并且初始化为层级模块，这个要自己实现
        /// </summary>
        /// <returns></returns>
        public List<WebSystemMenuDto> GetWebSystemMenuDtosAll()
        {
            //定义一个数值
            List<WebSystemMenuPo> wsmDbs = GetWebSystemMenuPoAll();
            //实力化
            List<WebSystemMenuDto> viewsAll = new List<WebSystemMenuDto>();
            ///获取最顶级的列表，1是为最高的，就是排序最高的数字，所以1是顶级
            List<WebSystemMenuPo> oneModel = wsmDbs.Where(c => c.wm_level == 1).ToList();

            foreach (var item in oneModel)
            {
                //对子模块进行子模块的子模块列表递归初始化
                WebSystemMenuDto oneView = IniViewModel(item, wsmDbs);
                viewsAll.Add(oneView);
            }
            return viewsAll;
        }
        /// <summary>
        /// 对指定模块进行初始化和递归初始化模块子列表, 并返回初始化好的View
        /// </summary>
        /// <param name="db">指定模块</param>
        /// <param name="wsmDbs">所有模块列表</param>
        /// <returns></returns>
        public WebSystemMenuDto IniViewModel(WebSystemMenuPo db, List<WebSystemMenuPo> wsmDbs)
        {
            //对model之间的数据进行复制，就是将这里的值赋给新建的值里头
            WebSystemMenuDto view = ModelCopier.CreateInstanceFrom<WebSystemMenuDto>(db);
            //搜索指定菜单的所有的子列表
            List<WebSystemMenuPo> sonList = wsmDbs.Where(c => c.wm_parent_code == view.wm_code).ToList();
            //循环子列表
            if (sonList != null && sonList.Count > 0)
            {
                view.SonWebSystemMenuViewList = new List<WebSystemMenuDto>();
                foreach (var s in sonList)
                {
                    //对子模块进行子模块的子模块列表递归初始化，查到最小的值
                    WebSystemMenuDto son = IniViewModel(s, wsmDbs);
                    view.SonWebSystemMenuViewList.Add(son);
                }
            }

            return view;

        }
        /// <summary>
        /// 验证方法 
        /// </summary>
        /// <param name="wsmCode"></param>
        /// <returns></returns>
        public bool VMenuCode(string wsmCode)
        {
            if (_IWebSystemMenuRepository.GetWebSystemMenuPoByCode(wsmCode) == null) return true;
            return false;
        }

        public bool MenuAdd(WebSystemMenuPo wsmDb)
        {
            return _IWebSystemMenuRepository.WebSystemMenuPoAdd(wsmDb);
        }



        /// <summary>
        /// 修改
        /// </summary>
        /// <param name="wsm"></param>
        /// <returns></returns>
        public bool WebSystemMenuPoUpdate(WebSystemMenuPo wsm)
        {
            return _IWebSystemMenuRepository.WebSystemMenuPoUpdate(wsm);
        }

        /// <summary>
        /// 获取父菜单的名称
        /// </summary>
        /// <param name="wMCode"></param>
        /// <returns></returns>
        public WebSystemMenuDto GetWebSystemMenuDtoByCode(string wMCode)
        {
            return _IWebSystemMenuRepository.GetWebSystemMenuDtoByCode(wMCode);
        }

        /// <summary>
        /// 根据用户获取层级网页系统菜单
        /// </summary>
        /// <returns></returns>
        public List<WebSystemMenuDto> GetUserWebSystemMenuPo()
        {
            //获取token，我们根据获取的token去获取他的登录人的姓名
            LoginUserDto user = AdminUserService.GetLoginUserDto();
            if (user == null) return null;
            //这波啊，这波是根据用token获取的用户名，在调用dal层的根据名字查询数据的方法查出数据。
            List<WebSystemMenuPo> dbMenu = _IWebSystemMenuRepository.GetWebSystemMenuPosUserName(user.user_name);
            //对他进行一个非空的验证
            if (dbMenu == null || dbMenu.Count == 0) return null;
            //实例
            List<WebSystemMenuDto> viewsAll = new List<WebSystemMenuDto>();
            //获取最顶级的列表
            List<WebSystemMenuPo> oneModels = dbMenu.Where(c => c.wm_level == 1).ToList();

            foreach (var item in oneModels)
            {
                //对子模块进行子模块的子模块列表递归初始化
                //人话就是查询顶级的、就是父级下面的子列表
                WebSystemMenuDto oneView = IniViewModel(item, dbMenu);
                viewsAll.Add(oneView);
            }
            return viewsAll;
        }
    }
}
